#pragma once

#include <iostream>
#include <fstream>
#include <filesystem>
#include <cstring>

/**
 * -保留所有项目中使用过的知识 中 具有强公用属性的函数
 */
namespace ytool {
/// 创建文件夹
inline int create_directory(const std::string& path)
{
    // 使用 std::filesystem::status 获取文件/文件夹的状态
    std::filesystem::file_status status = std::filesystem::status(path);

    if (std::filesystem::exists(status)) {
        // 是文件夹，直接返回
        if (std::filesystem::is_directory(status))
            return 0;

        std::cerr << "Path exists, but it is not a folder." << std::endl;
        return 1;
    }

    // 文件/文件夹不存在，创建文件夹
    if (std::filesystem::create_directories(path))
        return 0;

    return 1;
}
/// 读取文件
inline int read_file(const std::string &fileName, std::string &dst)
{
    std::ifstream ifs(fileName.c_str(), std::ios::in);
    if (!ifs.is_open())
        return 1;

    // 设置流位置指针到文件尾
    ifs.seekg(0, std::ios::end);

    // 获取文件大小
    std::streampos fileSize = ifs.tellg();

    // 重新设置流位置指针到文件头
    ifs.seekg(0, std::ios::beg);

    // 读取整个文件内容
    dst.resize(fileSize);
    ifs.read(&dst[0], fileSize);

    // 关闭文件流
    ifs.close();

    return 0;
}
inline int read_file(const std::string &fileName, char **dst, int32_t &size)
{
    std::ifstream ifs(fileName.c_str());
    if(!ifs.is_open())
        return 1;

    if(*dst) {
        memset(*dst,0xdd,strlen(*dst));
    }

    size = std::filesystem::file_size(fileName);
    *dst = new char[size];
    ifs.read(*dst,size);
    return 0;
}

/// 写入文件
inline int write_file(const std::string &fileName, const char *dst,const int32_t &size, std::ios_base::openmode mode = std::ios::out)
{
    std::ofstream ofs(fileName.c_str(),mode);
    if(!ofs.is_open()) {
        return 1;
    }
    ofs.write(dst,size);

    ofs.close();
    return 0;
}
inline int write_file(const std::string &fileName, const std::string &dst, std::ios_base::openmode mode = std::ios::out) { return write_file(fileName,dst.c_str(),dst.size(),mode); }
}
